//
//  "$Id: Matrix.h 91860 2012-12-08 09:18:30Z li_weijun $"
//
//  Copyright (c)1992-2007, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:	
//	Revisions:		Year-Month-Day  SVN-Author  Modification
//

#ifndef __MATRIX_API_H__
#define __MATRIX_API_H__

#include "Types.h"
#include "Defs.h"

#ifdef __cplusplus
extern "C" {
#endif

/// \defgroup MatrixAPI API Matrix
/// 矩阵接口，子卡统一用Matrix接口来管理。
///	\n 调用流程图:
/// \code
///    ==========================
///               |
///               |
///          createMatrix
///               |
///            addRef
///               |
///            getCaps
///               |
///          setCardMode
///               |
///          getCardInfo
///               |
///        setCardAddress
///               |
///        	   connect
///               |
///            release
///               |
///    ===========================
/// \endcode
/// @{

#include "Types.h"


/// 视屏矩阵设备特性结构，32位系统下128字节
typedef struct MatrixCaps
{
	/// 支持的子卡槽位个数
	int cards;

	/// 支持的解码卡工作模式，按位表示，每一位依次对应MatrixCardMode成员
	int cardModes;

	///< 保留字节
	int reserved[30];

} MatrixCaps;				


/// 矩阵子卡类型
typedef enum MatrixCardType
{
	matrixCardInput = 0x001,	///< 输入卡
	matrixCardOutput = 0x0002,	///< 输出卡
	matrixCardEncode = 0x0004,	///< 编码卡
	matrixCardDecode = 0x0008,	///< 解码卡
	matrixCardCascade = 0x0010,	///< 级联卡
} MatrixCardType;


/// 矩阵子卡视频信号接口类型
typedef enum MatrixCardInterface
{
	matrixCardCVBS,		///< CVBS
	matrixCardVGA,		///< VGA
	matrixCardDVI,		///< DVR
	matrixCardBT656,	///< BT656
	matrixCardBT1120,	///< BT1120
	matrixCardSPF,		///< 光纤
	matrixCardInterfaceNumber
} MatrixCardInterface;


/// 矩阵子卡视频分辨率
typedef enum MatrixCardDefinition
{
	matrixCardStandardDefinition,	///< 标清卡
	matrixCardHighDefinition,		///< 高清卡
	matrixCardDefinitionNumber
} MatrixCardDefinition;


/// 矩阵子卡状态
typedef enum MatrixCardStatus
{
	matrixCardNormal,			///< 正常
	matrixCardNoResponse,		///< 无响应
	matrixCardNetAbort,			///< 网络断开
	matrixCardIPConflict,		///< IP冲突
	matrixCardUpgrading,		///< 正在升级
	matrixCardStatusNumber
} MatrixCardStatus;


/// 子卡使用模式
typedef enum MatrixCardMode
{
	matrixCardStandAlone,		///< 独立模式，子卡单独管理
	matrixCardExternal,			///< 扩展模式，解码子卡的输出通道通道认为是主板的输出通道，子卡不单独管理
	matrixCardDecodePure,		///< 纯解码模式，解码子卡的解码输出回传到主板主输出显示，子卡不单独管理
	matrixCardDisable,			///< 禁止模式，子卡不工作
} MatrixCardMode;


/// 矩阵子卡信息，32位系统下128字节
typedef struct MatrixCardInfo
{
	unsigned int		exist : 1;				///< 子卡是否存在
	unsigned int		type : 15;				///< 子卡类型，MatrixCardType的组合
	MatrixCardInterface	interface : 8;			///< 子卡接口
	MatrixCardDefinition definition : 8;		///< 子卡分辨率
	unsigned int		videoInputChanels : 8;	///< 子卡视频输入通道数
	unsigned int		audioInputChanels : 8;	///< 子卡音频输入通道数
	unsigned int		videoOutputChanels : 8;	///< 子卡视频输出通道数
	unsigned int		audioOutputChanels : 8;	///< 子卡音频输出通道数
	unsigned int		videoEncodeChanels : 8;	///< 子卡视频编码通道数
	unsigned int		audioEncodeChanels : 8;	///< 子卡音频编码通道数
	unsigned int		videoDecodeChanels : 8;	///< 子卡视频解码通道数
	unsigned int		audioDecodeChanels : 8;	///< 子卡音频解码通道数
	char				address[32];			///< 子卡IP地址
	unsigned short		port;					///< 子卡网络端口号
	uchar				commPorts;				///< 子卡串口端口数
	MatrixCardStatus	status : 8;				///< 子卡状态
	MatrixCardMode		mode : 8;				///< 子卡模式
	unsigned int		cascadeInputChanels : 8;///< 子卡级联输入通道数
	unsigned int		cascadeOutputChanels : 8;///< 子卡级联输出通道数
	unsigned int		cascadeChanelBitrate;	///< 子卡级联通道带宽，单位Mbps
	int					reserved[17];			///< 保留字节
}MatrixCardInfo;


/// 矩阵子卡配置，256字节
typedef struct MatrixCardConfig
{
	char	ipAddress[32];		///< IP地址
	char	subnetMask[32];		///< 子网掩码
	char	defaultGateway[32]; ///< 默认网关
	int		reserved[40];		///< 保留字节
}MatrixCardConfig;


/// 矩阵级联命令，128字节
typedef struct MatrixCascadeCommand
{
	char	srcAddress[32];		///< 源设备地址
	char	destAddress[32];	///< 目的设备地址
	int		connectionId;		///< 连接ID
	int		packetType;			///< 包类型，0-命令，1-数据
	unsigned int packetLength;	///< 包数据长度
	void*	commandBuffer;		///< 命令缓冲
	int		cascadeCard;		///< 矩阵级联子卡槽位号
	int		cascadeChannel;		///< 矩阵级联子卡通道号
	int		reserved[10];		///< 保留字节
} MatrixCascadeCommand;


/// 矩阵视频捕获，128字节
typedef struct MatrixVideoCapture
{
	char srcAddress[32];		///< 源设备地址
	char destAddress[32];		///< 目的设备地址
	int connectionId;			///< 连接ID
	int videoInputCard;			///< 矩阵视频输入子卡槽位号
	int videoInputChannel;		///< 矩阵视频输入子卡通道号
	int cascadeOutputCard;		///< 矩阵级联输出子卡槽位号
	int cascadeOutputChannel;	///< 矩阵级联输出子卡通道号
	int reserved[11];			///< 保留字节
} MatrixVideoCapture;


/// 矩阵级联映射，128字节
typedef struct MatrixCascadeMap
{
	char srcAddress[32];		///< 源设备地址
	char destAddress[32];		///< 目的设备地址
	int connectionId;			///< 连接ID
	int cascadeInputCard;		///< 矩阵级联输入子卡槽位号
	int cascadeInputChannel;	///< 矩阵级联输入子卡通道号
	int cascadeOutputCard;		///< 矩阵级联输出子卡槽位号
	int cascadeOutputChannel;	///< 矩阵级联输出子卡通道号
	int reserved[11];			///< 保留字节
} MatrixCascadeMap;


/// 矩阵接口，128个指针
typedef struct Matrix
{
	/// 底层私有数据
	void *priv;


	/// 增加接口引用
	int (*addRef)(struct Matrix *thiz);


	/// 释放接口
	int (*release)(struct Matrix *thiz);


	/// 得到矩阵支持的特性。
	/// 
	/// \param [in] thiz 矩阵接口指针
	/// \param [out] caps 指向矩阵特性结构MatrixCaps的指针。
	/// \retval 0  获取成功。
	/// \retval <0  获取失败。
	int (*getCaps)(struct Matrix *thiz, MatrixCaps * caps);


	/// 获取子卡信息，对主板有效
	/// 
	/// \param [in] thiz 矩阵接口指针
	/// \param [in] card 子卡槽位号，从1开始编号
	/// \param [out] info 矩阵子卡信息
	int (*getCardInfo)(struct Matrix *thiz, int card, MatrixCardInfo *info);


	/// 设置子卡配置
	/// 
	/// \param [in] thiz 矩阵接口指针
	/// \param [in] card 子卡槽位号，从1开始编号
	/// \param [in] config 矩阵子卡配置结构指针。
	int (*setCardConfig)(struct Matrix *thiz, int card, MatrixCardConfig *config);


	/// 发送级联命令
	/// 
	/// \param [in] thiz 矩阵接口指针
	/// \param [in] message 指向待发送消息MatrixCascadeCommand的结构指针。
	/// \retval 0  发送成功。
	/// \retval <0  发送失败。
	int (*sendCascadeCommand)(struct Matrix *thiz, MatrixCascadeCommand* command);


	/// 接收级联命令
	/// 
	/// \param [in] thiz 矩阵接口指针
	/// \param [in] message 指向接口消息MatrixCascadeCommand的结构指针。
	/// \retval 0  接收成功。
	/// \retval <0  接收失败。
	int (*recvCascadeCommand)(struct Matrix *thiz, MatrixCascadeCommand* command);
	

	/// 开始视频数据采集
	/// 
	/// \param [in] thiz 矩阵接口指针
	/// \param [in] capture 指向视频捕获MatrixVideoCapture结构指针
	/// \retval 0  操作成功。
	/// \retval <0  操作失败。
	int (*startVideoCapture)(struct Matrix *thiz, MatrixVideoCapture* capture);

	
	/// 停止视频数据采集
	/// 
	/// \param [in] thiz 矩阵接口指针
	/// \param [in] capture 指向视频捕获MatrixVideoCapture结构指针
	/// \retval 0  操作成功。
	/// \retval <0  操作失败。
	int (*stopVideoCapture)(struct Matrix *thiz, MatrixVideoCapture* capture);


	/// 开始数据级联
	/// 
	/// \param [in] thiz 矩阵接口指针
	/// \param [in] capture 指向数据级联MatrixCascadeMap指针
	/// \retval 0  操作成功。
	/// \retval <0  操作失败。
	int (*startCascadeMap)(struct Matrix *thiz, MatrixCascadeMap* map);

	
	/// 停止数据级联
	/// 
	/// \param [in] thiz 矩阵接口指针
	/// \param [in] capture 指向数据级联MatrixCascadeMap指针
	/// \retval 0  操作成功。
	/// \retval <0  操作失败。
	int (*stopCascadeMap)(struct Matrix *thiz, MatrixCascadeMap* map);

	
	/// 设置子卡工作模式
	/// 当前子卡工作模式可以通过getCardInfo获取，对于已经设置成matrixCardExternal
	/// 和matrixCardDecodePure模式的子卡，不能再通过create****系列API创建接口。
	/// 
	/// \param [in] thiz 矩阵接口指针
	/// \param [in] card 子卡槽位号，从1开始编号
	/// \param [in] mode 子卡工作模式
	/// \retval 0  操作成功。
	/// \retval <0  操作失败。
	int (*setCardMode)(struct Matrix *thiz, int card, MatrixCardMode mode);


	///< 保留字节
	void* reserved[115];
} Matrix;


/// 矩阵接口描述，32位系统下128字节
typedef struct MatrixDesc
{
	int				reserved[32];	///< 保留
} MatrixDesc;


/// 创建矩阵接口
///
/// \param [in] desc 矩阵接口描述结构MatrixDesc指针
/// \param [out] Matrix 矩阵接口指针的指针
/// \retval <0 创建失败
/// \retval 0 创建成功
int PAL_API createMatrix(MatrixDesc *desc, Matrix **matrix);


/// @} end of group

#ifdef __cplusplus
}
#endif

#endif //__MATRIX_API_H__

